package com.xbongbong.saas.model.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.xbongbong.paas.constant.PaasConstant;
import com.xbongbong.paas.enums.DelEnum;
import com.xbongbong.paas.field.MultiUnitItemPoJo;
import com.xbongbong.paas.pojo.MultiUnitPricePoJo;
import com.xbongbong.paas.pojo.ProductFieldPojo;
import com.xbongbong.paas.field.UnitItemPoJo;
import com.xbongbong.paas.redis.RedisPrefixConstant;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.saas.constant.BasicConstant;
import com.xbongbong.saas.constant.ParameterConstant;
import com.xbongbong.saas.domain.dao.ProductUnitPriceDao;
import com.xbongbong.saas.domain.entity.ProductUnitPriceEntity;
import com.xbongbong.saas.enums.business.ProductEnum;
import com.xbongbong.saas.help.SaasFormHelp;
import com.xbongbong.saas.model.ProductModel;
import com.xbongbong.saas.model.ProductUnitPriceModel;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

@Service("productUnitPriceModel")
public class ProductUnitPriceModelImpl implements ProductUnitPriceModel {
    @Resource
    private ProductUnitPriceDao productUnitPriceDao;
    @Resource
    private SaasFormHelp saasFormHelp;
    @Resource
    private ProductModel productModel;


    @Override
    public void insertBatch(List<ProductUnitPriceEntity> productUnitPriceEntities) {
        productUnitPriceDao.insertBatch(productUnitPriceEntities);
    }

    @Override
    public Map<Long, List<MultiUnitPricePoJo>> getPriceMapByProductIdSet(String corpid, Set<Long> productIdSet) throws XbbException {
        Map<String, Object> param = new HashMap<>(new HashMap<>(PaasConstant.DEFAULT_INITIAL_CAPACITY));
        param.put(ParameterConstant.CORPID, corpid);
        param.put(ParameterConstant.PRODUCT_ID_IN, productIdSet);
        param.put(ParameterConstant.DEL, BasicConstant.ZERO);
        List<ProductUnitPriceEntity> productUnitPriceEntities = productUnitPriceDao.findEntities(param);
        Map<Long, List<MultiUnitPricePoJo>> map = new HashMap<>(productUnitPriceEntities.size());
        ProductFieldPojo productFieldPojo = saasFormHelp.getProductFieldPojo(RedisPrefixConstant.PRODUCT_UNIT, ProductEnum.UNIT.getAttr(), corpid);
        Map<Long, List<UnitItemPoJo>> groupMap = productFieldPojo.getMultiItems().stream().collect(Collectors.toMap(MultiUnitItemPoJo::getValue, MultiUnitItemPoJo::getItemDataPoJoList));
        productUnitPriceEntities.forEach(productUnitPriceEntity -> {
            List<UnitItemPoJo> unitItemPoJos = groupMap.get(productUnitPriceEntity.getUnitGroupId());
//            List<MultiUnitPricePoJo> multiUnitPricePoJos = productUnitPriceEntity.getPrice().toJavaList(MultiUnitPricePoJo.class);
//            if (unitItemPoJos.size() != multiUnitPricePoJos.size()) {
//                List<Long> priceUnitIds = new ArrayList<>();
//                multiUnitPricePoJos.forEach(price->priceUnitIds.add(price.getValue()));
//                for (UnitItemPoJo itemPoJo : unitItemPoJos) {
//                    if (!priceUnitIds.contains(itemPoJo.getValue())) {
//                        MultiUnitPricePoJo multiUnitPricePoJo = new MultiUnitPricePoJo();
//                        multiUnitPricePoJo.setValue(itemPoJo.getValue());
//                        multiUnitPricePoJo.setText(itemPoJo.getText());
//                        multiUnitPricePoJo.setRate(0D);
//                        multiUnitPricePoJos.add(multiUnitPricePoJo);
//                    }
//                }
//            }
            List<MultiUnitPricePoJo> multiUnitPricePoJos = ProductModelImpl.formatMultiPrice(productUnitPriceEntity.getPrice(), unitItemPoJos);
            map.put(productUnitPriceEntity.getProductId(), multiUnitPricePoJos);
        });
        return map;
    }

    @Override
    public void save(ProductUnitPriceEntity entity) throws XbbException {
        Long id = entity.getId();
        if (id == null || id == 0) {
            // 新建
            insert(entity);
        } else {
            // 更新
           update(entity);
        }
    }

    @Override
    public List<ProductUnitPriceEntity> getPriceEntitysByParentId(String corpid, Long parentProductId) {
        Map<String, Object> param = new HashMap<>(1 << 1);
        param.put(ParameterConstant.CORPID, corpid);
        param.put(ParameterConstant.PARENT_ID, parentProductId);
        param.put(ParameterConstant.DEL, 0);
        return productUnitPriceDao.findEntities(param);
    }

    @Override
    public void updateBatch(List<ProductUnitPriceEntity> updateBatchList, String corpid) {
        productUnitPriceDao.updateBatch(updateBatchList, corpid);
    }

    @Override
    public Map<Long, List<ProductUnitPriceEntity>> getPriceEntitysByParentIdIn(String corpid, Set<Long> parentIdIn) throws XbbException {
        Map<String, Object> param = new HashMap<>(PaasConstant.DEFAULT_INITIAL_CAPACITY);
        param.put(ParameterConstant.CORPID, corpid);
        param.put(ParameterConstant.DEL, DelEnum.NORMAL.getDel());
        param.put("parentIdIn", parentIdIn);
        List<ProductUnitPriceEntity> entitys = productUnitPriceDao.findEntities(param);
        Map<Long, List<ProductUnitPriceEntity>> map = new HashMap<>(PaasConstant.DEFAULT_INITIAL_CAPACITY);
        ProductFieldPojo productFieldPojo = saasFormHelp.getProductFieldPojo(RedisPrefixConstant.PRODUCT_UNIT, ProductEnum.UNIT.getAttr(), corpid);
        Map<Long, List<UnitItemPoJo>> groupMap = productFieldPojo.getMultiItems().stream().collect(Collectors.toMap(MultiUnitItemPoJo::getValue, MultiUnitItemPoJo::getItemDataPoJoList));

        for (ProductUnitPriceEntity productUnitPriceEntity : entitys) {
            List<ProductUnitPriceEntity> productUnitPriceEntityList = new ArrayList<>();
            Long dataId = productUnitPriceEntity.getParentId();
            List<UnitItemPoJo> unitItemPoJos = groupMap.get(productUnitPriceEntity.getUnitGroupId());
            if (map.containsKey(dataId)){
                productUnitPriceEntityList = map.get(dataId);
            }
            List<MultiUnitPricePoJo> multiUnitPricePoJos = ProductModelImpl.formatMultiPrice(productUnitPriceEntity.getPrice(), unitItemPoJos);
            productUnitPriceEntity.setPrice(JSONArray.parseArray(JSON.toJSONString(multiUnitPricePoJos)));
            productUnitPriceEntityList.add(productUnitPriceEntity);
            map.put(dataId, productUnitPriceEntityList);
        }
        return map;
    }


    @Override
    public Integer insert(ProductUnitPriceEntity entity) throws XbbException {
        return productUnitPriceDao.insert(entity);
    }

    @Override
    public Integer update(ProductUnitPriceEntity entity) throws XbbException {
        return productUnitPriceDao.update(entity);
    }

    @Override
    public List<ProductUnitPriceEntity> findEntitys(Map<String, Object> param) {
        return productUnitPriceDao.findEntities(param);
    }

    @Override
    public Integer getEntitysCount(Map<String, Object> param) {
        return productUnitPriceDao.getEntitiesCount(param);
    }

    @Override
    public List findEntitysWithoutSub(Map<String, Object> param) {
        return null;
    }
}
